সি# এ মাল্টিথ্রেডিং একটি গুরুত্বপূর্ণ ফিচার, যা একই সময়ে একাধিক কাজ সম্পন্ন করতে সহায়তা করে। মাল্টিথ্রেডিংয়ের মাধ্যমে একটি প্রোগ্রামে একাধিক থ্রেড চালানো যায়, যাতে তারা সমান্তরালে কাজ করে এবং প্রোগ্রামের কার্যক্ষমতা বাড়ায়। সি# এ মাল্টিথ্রেডিং করতে Thread ক্লাস ব্যবহৃত হয়, যা System.Threading
নেমস্পেসের অংশ।
একটি থ্রেড হলো কোড এক্সিকিউশনের একটি নির্দিষ্ট পথ। মাল্টিথ্রেডিং এর মাধ্যমে প্রোগ্রামে একাধিক থ্রেড তৈরি করে একই সময়ে বিভিন্ন কাজ চালানো যায়। এতে:
Thread ক্লাস ব্যবহার করে একটি নতুন থ্রেড তৈরি এবং নিয়ন্ত্রণ করা যায়। এটি বিভিন্ন মেথড ও প্রোপার্টি সরবরাহ করে, যা থ্রেডের জীবনচক্র নিয়ন্ত্রণে সহায়তা করে।
একটি নতুন থ্রেড তৈরি করতে Thread
ক্লাস ব্যবহার করে ThreadStart
ডেলিগেটের মাধ্যমে নির্দিষ্ট মেথডে থ্রেড সেট করা হয়।
using System;
using System.Threading;
public class Program
{
public static void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
Thread.Sleep(1000); // এক সেকেন্ড অপেক্ষা
}
}
public static void Main()
{
// থ্রেড তৈরি করা
Thread thread = new Thread(PrintNumbers);
thread.Start();
Console.WriteLine("Main thread is running independently.");
}
}
new Thread(PrintNumbers)
দিয়ে একটি নতুন থ্রেড তৈরি করা হয়েছে, যা PrintNumbers
মেথডে কাজ করবে।Start()
মেথড দিয়ে থ্রেড চালু করা হয়েছে।Sleep
মেথড দিয়ে থ্রেড এক সেকেন্ড অপেক্ষা করবে (milliseconds হিসাবে), অর্থাৎ প্রতিটি সংখ্যা এক সেকেন্ডের ব্যবধানে প্রিন্ট করবে।থ্রেডের Priority সেট করে কাজের গুরুত্ব অনুযায়ী থ্রেড চালানো যায়। ThreadPriority
এনাম ব্যবহার করে থ্রেডের প্রাধান্য নির্ধারণ করা হয়, যেমন Highest
, AboveNormal
, Normal
, BelowNormal
, এবং Lowest
।
thread.Priority = ThreadPriority.Highest;
সি# এ থ্রেডকে Sleep
মেথড দিয়ে সাময়িকভাবে স্থগিত করা যায়, তবে থ্রেডকে পুনরায় শুরু করার জন্য Suspend
এবং Resume
মেথড এখন আর ব্যবহৃত হয় না, কারণ এগুলো ডেডলকের কারণ হতে পারে। বরং থ্রেড কন্ট্রোলের জন্য মানসিক কোড লজিক ব্যবহার করা হয়।
Join()
মেথড ব্যবহার করে বর্তমান থ্রেডকে অপেক্ষা করানো যায় যতক্ষণ না নির্দিষ্ট থ্রেড কাজ শেষ করে।
Thread thread = new Thread(PrintNumbers);
thread.Start();
thread.Join(); // Main thread waits until this thread completes
Console.WriteLine("Main thread resumes after the other thread completes.");
thread.Join()
ব্যবহার করলে মেইন থ্রেড অপেক্ষা করবে যতক্ষণ না PrintNumbers
থ্রেড কাজ শেষ করে। এরপর মেইন থ্রেড পরবর্তী কোড চালাবে।
যদি একাধিক থ্রেড একই রিসোর্স অ্যাক্সেস করে, তবে ডেটা ইনকনসিস্টেন্সি ঘটতে পারে। এই সমস্যা সমাধানের জন্য lock ব্যবহার করা হয়, যা একবারে কেবলমাত্র একটি থ্রেডকে রিসোর্স অ্যাক্সেস করার অনুমতি দেয়।
using System;
using System.Threading;
public class Program
{
private static readonly object lockObj = new object();
public static void PrintNumbers()
{
lock (lockObj)
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
Thread.Sleep(500);
}
}
}
public static void Main()
{
Thread thread1 = new Thread(PrintNumbers);
Thread thread2 = new Thread(PrintNumbers);
thread1.Start();
thread2.Start();
}
}
lock (lockObj)
দিয়ে একবারে একটি থ্রেডকে PrintNumbers
মেথডের মধ্যে এক্সিকিউট করার অনুমতি দেওয়া হয়েছে।lockObj
অবজেক্ট দ্বারা সিঙ্ক্রোনাইজেশন নিশ্চিত করা হয়েছে, যাতে একই সময়ে কেবলমাত্র একটি থ্রেডই PrintNumbers
মেথড অ্যাক্সেস করতে পারে।Abort()
মেথড ব্যবহার করে থ্রেডকে বন্ধ করা যায়, তবে এটি প্রায়শই এড়িয়ে চলা হয় কারণ এটি থ্রেডের জীবনচক্রে সমস্যা তৈরি করতে পারে।
Thread thread = new Thread(PrintNumbers);
thread.Start();
thread.Abort(); // Thread forcibly terminated
নোট: থ্রেড অ্যাবোর্ট অপ্রচলিত এবং এটি ব্যবহার করা বিপজ্জনক হতে পারে। Abort
এর পরিবর্তে থ্রেড বন্ধ করার জন্য বিকল্প পদ্ধতি ব্যবহার করা উচিত, যেমন একটি ফ্ল্যাগ পরিবর্তন করে থ্রেড বন্ধ করা।
csharp
Copy code
using System;
using System.Threading;
public class Program
{
public static void PrintNumbers()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine("Number: " + i);
Thread.Sleep(500);
}
}
public static void PrintLetters()
{
for (char letter = 'A'; letter <= 'E'; letter++)
{
Console.WriteLine("Letter: " + letter);
Thread.Sleep(500);
}
}
public static void Main()
{
Thread thread1 = new Thread(PrintNumbers);
Thread thread2 = new Thread(PrintLetters);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.WriteLine("Both threads have completed.");
}
}
PrintNumbers
এবং PrintLetters
নামে দুটি আলাদা মেথড আছে।thread1
এবং thread2
নামে দুটি থ্রেড তৈরি করে সেগুলোকে দুটি মেথডে এসাইন করা হয়েছে।thread1.Start()
এবং thread2.Start()
দিয়ে থ্রেড চালানো হয়েছে এবং Join()
দিয়ে নিশ্চিত করা হয়েছে যে দুই থ্রেডের কাজ শেষ হলে পরবর্তী কোড চালাবে।সি# এ মাল্টিথ্রেডিং ব্যবহারে প্রোগ্রামের পারফরম্যান্স বাড়ানো যায় এবং একই সাথে একাধিক কাজ করা সম্ভব হয়।
আরও দেখুন...